package br.edu.ufcg.dsc.psoo.mymoney.controller;

import java.util.List;

import org.hibernate.SessionFactory;

import br.edu.ufcg.dsc.psoo.mymoney.controller.exceptions.InvalidTypeException;
import br.edu.ufcg.dsc.psoo.mymoney.controller.exceptions.TypeNotFoundException;
import br.edu.ufcg.dsc.psoo.mymoney.model.bean.Type;
/**
 * Interface do controller respons�vel pela valida��o e opera��es envolvendo tipos
 * 
 * @author leonardo
 * 
 */
public interface TypeController {

	/**
	 * Fecha sess�o do Hibernate utilizada na instancia local de AccountDAO
	 */
	public abstract void closeSession();

	/**
	 * Valida e cria novo tipo
	 * 
	 * @param type
	 * @return Type tipo criado
	 * @throws InvalidTypeException
	 *             erro de valida��o
	 */
	public abstract Type create(Type type) throws InvalidTypeException;

	/**
	 * Valida e deleta tipo
	 * 
	 * @param id
	 *            identificador do tipo a ser deletado
	 * @param userId
	 *            id do usu�rio logado no sistema
	 * @throws InvalidTypeException
	 * @throws TypeNotFoundException
	 */
	public abstract void delete(Long id, Long userId)
			throws InvalidTypeException, TypeNotFoundException;

	/**
	 * Abre sess�o do Hibernate utilizada na instancia local de TypeDAO
	 */
	public abstract void openSession();

	/**
	 * Seta a SessionFactory criada no ApplicationManager (Mentawai)
	 * 
	 * @param sf
	 *            SessionFactory
	 */
//	public abstract void setSessionFactory(SessionFactory sf);

	/**Retorna todos os tipos cadastrados para um usu�rio informado
	 * @param userId identificador do usu�rio
	 * @return lista de tipos
	 */
	public abstract List<Type> listAll(Long userId);

	/**
	 * Valida e atualiza tipo
	 * 
	 * @param type
	 * @return Type tipo atualizado
	 * @throws InvalidTypeException
	 */
	public abstract Type update(Type type) throws InvalidTypeException;
	
	//TODO javadoc
	public Type findByName(String name);
	//TODO javadoc
	public Type loadById(Long id);
}